package cliente_diseno2011;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.UnknownHostException;

import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import red.InputUrnaJob;
import red.OutputJob;
import red.OutputUrnaJob;
import red.SSLClient;

public class Controller {

	private Interfaz interfazUsuario;
	private Modelo logicaVotacion;
	String tarjeta;
	String host="localhost";
	String puerto="8888";
	String timmer="5000";

	public Controller(Interfaz vista, Modelo logica) {

		logicaVotacion = logica;
		interfazUsuario = vista;
		interfazUsuario.setModelo(logicaVotacion);
		interfazUsuario.addLoginListener(new LoginListener());

	}

	public class LoginListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			tarjeta = interfazUsuario.getIdTarjeta();
			String permiso;

			try {

				permiso = logicaVotacion.chequearTarjeta(tarjeta);
				System.out.println("paso por aca con el permiso " + permiso);
				interfazUsuario.cambiarVista(permiso);
				if (permiso.equals("votante")) {
					interfazUsuario.addPostSigListener(new PostSigListener());
					interfazUsuario.addPostAntListener(new PostAntListener());
				} else {
					if (permiso.equals("error no existe")) {
						interfazUsuario.informarExistencia();
					} else {
						if (permiso.equals("error voto")) {

							interfazUsuario.informarYaVoto();
						} else {
							if (permiso.equals("presidente")) {
								interfazUsuario
										.addInicioListener(new IniciarListener());
								interfazUsuario
										.addLogoutPresiListener(new LogoutPresiListener());
								interfazUsuario
										.addCerrarListener(new CerrarListener());
								interfazUsuario
										.addEnviarListener(new EnviarListener());
							} else {
								if (permiso.equals("administrador")) {
									interfazUsuario
											.addHostListener(new HostListener());
									interfazUsuario
											.addLogoutAdListener(new LogOutAdListener());
									interfazUsuario
											.addCambiarPresidenteListener(new CambiarPresidenteListener());
								} else {
									if (permiso.equals("error apertura")) {
										interfazUsuario.informarErrorApertura();
									} else {
										if (permiso.equals("error presidente")) {
											interfazUsuario
													.informarErrorPresidente();
										} else {
											if (permiso.equals("ninguno")) {
												interfazUsuario
														.informarTarjetaInvalida();
											} else if (permiso
													.equals("error administrador")) {
												interfazUsuario
														.informarErrorAdministrador();
											}
										}
									}
								}
							}
						}
					}
				}
				
			} catch (FileNotFoundException e1) {

				e1.printStackTrace();
			}

		}
	}

	public class PostSigListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			String eleccion = interfazUsuario.getEleccion();
			if (eleccion != null) {

				if (logicaVotacion
						.getEtapa(interfazUsuario.getNumeroEtapa() + 1) == null) {

					interfazUsuario.presentarConfirmacion(
							new ConfirmarOkListener(),
							new ConfirmarCancelarListener());
				} else {
					interfazUsuario.siguienteEtapa();
					interfazUsuario.addPostSigListener(new PostSigListener());
					interfazUsuario.addPostAntListener(new PostAntListener());
				}
			} else {
				interfazUsuario.informarError();
				

			}
		}
	}

	public class PostAntListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			interfazUsuario.anteriorEtapa();
			interfazUsuario.addPostSigListener(new PostSigListener());
			interfazUsuario.addPostAntListener(new PostAntListener());

		}
	}

	public class ConfirmarOkListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			logicaVotacion.almacenarEleccion();
			logicaVotacion.eliminarTemp();
			logicaVotacion.finalizarVoto(tarjeta);

			interfazUsuario.presentarLogin();
			interfazUsuario.addLoginListener(new LoginListener());
		}
	}

	public class ConfirmarCancelarListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			logicaVotacion.eliminarTemp();
			interfazUsuario.presentarLogin();
			interfazUsuario.addLoginListener(new LoginListener());

		}
	}

	public class IniciarListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			logicaVotacion.setVotacion(true);
			interfazUsuario.setIniciada();

		}
	}

	public class CerrarListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			logicaVotacion.setVotacion(false);
			interfazUsuario.setFinalizada();

		}
	}

	public class EnviarListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			Runnable runClient = new Runnable() {

				@Override
				public void run() {
					try {
						SSLClient cliente = new SSLClient(host,
								Integer.parseInt(puerto),
								Integer.parseInt(timmer));

						OutputUrnaJob out = new OutputUrnaJob();
						out.setData(logicaVotacion.getDatosEnviar());
						out.setStateLabel(interfazUsuario.getLabelEstado());
						cliente.sendData(out);

						InputUrnaJob in = new InputUrnaJob();
						in.setStateLabel(interfazUsuario.getLabelEstado());
						cliente.processRecievedData(in);

						cliente.stop();
					} catch (final IOException e) {
						// TODO Auto-generated catch block
						SwingUtilities.invokeLater(new Runnable() {
							@Override
							public void run() {
								if (e.getMessage().equals(
										"Connection refused: connect")) {
									interfazUsuario.getLabelEstado().setText(
											"Imposible conectar al servidor");
								}
							}
						});
					}

				}
			};

			Thread thread = new Thread(runClient);
			thread.start();
			interfazUsuario.setEnviada();
		}
	}

	public class HostListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			host = interfazUsuario.getHost();
			puerto = interfazUsuario.getPuerto();
			timmer = interfazUsuario.getTimmer();

		}
	}

	public class CambiarPresidenteListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			if (logicaVotacion.cambiarPresidente(interfazUsuario
					.getPingPresidente())) {
				interfazUsuario.informarPresidenteCorrecto();
			} else {
				interfazUsuario.informarPresidenteIncorrecto();
			}

		}
	}

	public class LogoutPresiListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			interfazUsuario.volverLogin();
			interfazUsuario.addLoginListener(new LoginListener());

		}
	}

	public class LogOutAdListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {

			interfazUsuario.volverAdmin();
			interfazUsuario.addLoginListener(new LoginListener());

		}
	}

}